#pragma once


namespace lr
{
	template<size_t N>
	class bitset
	{
	public:
		bitset()
		{
			_bits.resize((N >> 5) + 1);
		}
		void set(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			_bits[i] |= (1 << j);
		}
		void reset(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			_bits[i] &= ~(1 << j);
		}

		bool test(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			//return _bits[i] & (1<<j);
			return (_bits[i] >> j) & 1;
		}
	private:
		vector<int> _bits;
	};


	//template<size_t N>
	//class twobitset
	//{
	//public:
	//	void set(size_t x)
	//	{
	//		//00
	//		//01
	//		//10
	//		if (bits1.test(x) == false && bits2.test(x) == false)
	//		{
	//			bits2.set(x);
	//		}
	//		else if (bits1.test(x) == false && bits2.test(x) == true)
	//		{
	//			bits2.reset(x);
	//			bits1.set(x);
	//		}
	//	}
	//	void Print()
	//	{
	//		for (size_t i = 0; i < N; i++)
	//		{
	//			if (bits1.test(i) == false && bits2.test(i) == true) 
	//			{
	//				cout << i << endl;
	//			}
	//		}
	//	}
	//private:
	//	bitset<N> bits1;
	//	bitset<N> bits2;
	//};

	template<size_t N>
	class twobitset
	{
	public:
		void set(size_t x)
		{
			//00
			//01
			//10
			//11
			if (bits1.test(x) == false && bits2.test(x) == false)
			{
				bits2.set(x);
			}
			else if (bits1.test(x) == false && bits2.test(x) == true)
			{
				bits2.reset(x);
				bits1.set(x);
			}
			else if (bits1.test(x) == true && bits2.test(x) == false)
			{
				bits1.set(x);
				bits2.set(x);
			}
		}
		//void Print()
		//{
		//	for (size_t i = 0; i < N; i++)
		//	{
		//		if (bits1.test(i) == false && bits2.test(i) == true) 
		//		{
		//			cout << i << endl;
		//		}
		//	}
		//}

		void Print()
		{
			for (size_t i = 0; i < N; i++)
			{
				if (bits1.test(i) == false && bits2.test(i) == true)
				{
					cout << i <<"--->1"<< endl;
				}
				if (bits1.test(i) == true && bits2.test(i) == false)
				{
					cout <<  i<< "--->2" << endl;
				}
			}
		}
	private:
		bitset<N> bits1;
		bitset<N> bits2;
	};

}